package com.zhiyou100.design.mode.singleton;

/**
 * @author yang
 * @className SingletonDemo02
 * @packageName com.zhiyou100.design.mode.singleton
 * @Description TODO 单例模式 第二版
 * @date 2020-08-13 21:16
 */
public class SingletonDemo02 {
    /**
     * 单例对象
     */
    private static SingletonDemo02 instance = null;

    /**
     * 私有化构造函数
     */
    private SingletonDemo02() {
    }

    /**
     * @return com.zhiyou100.design.mode.singleton.SingletonDemo02
     * @Description TODO 静态工厂方法
     * @name getInstance
     * @param: []
     * @date 8/13/20 21:22
     * @author yang
     */
    public static SingletonDemo02 getInstance() {
        // 双重检测机制
        if (instance == null) {
            /*
            1、为了防止 new SingletonDemo02 被执行多次，在 new 之前加上 synchronized 同步锁，锁住整个类（这里不能使用对象锁）
             */
            // 同步锁
            synchronized (SingletonDemo02.class) {
               /*
               2、进入Synchronized 临界区以后，还要再做一次判空。因为当两个线程同时访问的时候，线程A构建完对象，线程B也已经通过了最初的判空验证，不做第二次判空的话，线程B还是会再次构建instance对象。
                */
                // 双重检测机制
                if (instance == null) {
                    instance = new SingletonDemo02();
                }
            }
        }
        return instance;
    }
}
